বাংলা

স্কিমা স্টিচিং এর মাধ্যমে GraphQL ফেডারেশনের শক্তি উন্মোচন করুন। একাধিক সার্ভিস থেকে একটি ইউনিফাইড GraphQL API তৈরি করে স্কেলেবিলিটি এবং রক্ষণাবেক্ষণ উন্নত করুন।

GraphQL ফেডারেশন: স্কিমা স্টিচিং - একটি বিস্তারিত গাইড

আধুনিক অ্যাপ্লিকেশন ডেভেলপমেন্টের ক্রমবর্ধমান ধারায়, স্কেলেবল এবং রক্ষণাবেক্ষণযোগ্য আর্কিটেকচারের প্রয়োজনীয়তা সবচেয়ে গুরুত্বপূর্ণ হয়ে উঠেছে। মাইক্রোসার্ভিস, তার মডিউলারিটি এবং স্বাধীনভাবে স্থাপনযোগ্যতার কারণে, একটি জনপ্রিয় সমাধান হিসেবে আবির্ভূত হয়েছে। তবে, অসংখ্য মাইক্রোসার্ভিস পরিচালনা করা জটিলতা তৈরি করতে পারে, বিশেষ করে যখন ক্লায়েন্ট অ্যাপ্লিকেশনগুলিতে একটি ইউনিফাইড API প্রকাশ করার প্রশ্ন আসে। এখানেই GraphQL ফেডারেশন, এবং বিশেষ করে স্কিমা স্টিচিং, কাজে আসে।

GraphQL ফেডারেশন কী?

GraphQL ফেডারেশন একটি শক্তিশালী আর্কিটেকচার যা আপনাকে একাধিক অন্তর্নিহিত GraphQL সার্ভিস (যা প্রায়শই মাইক্রোসার্ভিসগুলির প্রতিনিধিত্ব করে) থেকে একটি একক, ইউনিফাইড GraphQL API তৈরি করতে দেয়। এটি ডেভেলপারদের বিভিন্ন সার্ভিস জুড়ে ডেটা কোয়েরি করতে সক্ষম করে যেন এটি একটি একক গ্রাফ, যা ক্লায়েন্টের অভিজ্ঞতাকে সহজ করে এবং ক্লায়েন্ট-সাইডে জটিল অর্কেস্ট্রেশন লজিকের প্রয়োজনীয়তা হ্রাস করে।

GraphQL ফেডারেশনের দুটি প্রধান পদ্ধতি রয়েছে:

এই আর্টিকেলটি স্কিমা স্টিচিং-এর উপর আলোকপাত করবে এবং এর ধারণা, সুবিধা, সীমাবদ্ধতা এবং ব্যবহারিক বাস্তবায়ন অন্বেষণ করবে।

স্কিমা স্টিচিং বোঝা

স্কিমা স্টিচিং হলো একাধিক GraphQL স্কিমাকে একটি একক, সুসংহত স্কিমাতে একীভূত করার প্রক্রিয়া। এই ইউনিফাইড স্কিমাটি একটি ফ্যাসাড (facade) হিসেবে কাজ করে, যা ক্লায়েন্টের কাছ থেকে অন্তর্নিহিত সার্ভিসগুলির জটিলতা লুকিয়ে রাখে। যখন একজন ক্লায়েন্ট স্টিচড স্কিমাতে একটি অনুরোধ করে, গেটওয়ে বুদ্ধিমত্তার সাথে অনুরোধটি উপযুক্ত অন্তর্নিহিত সার্ভিস(গুলিতে) পাঠায়, ডেটা পুনরুদ্ধার করে এবং ফলাফলগুলি একত্রিত করে ক্লায়েন্টের কাছে ফেরত পাঠায়।

এটিকে এভাবে ভাবুন: আপনার কাছে একাধিক রেস্তোরাঁ (সার্ভিস) আছে, যার প্রত্যেকটি বিভিন্ন ধরনের খাবারে বিশেষজ্ঞ। স্কিমা স্টিচিং একটি সার্বজনীন মেনুর মতো যা প্রতিটি রেস্তোরাঁর সমস্ত খাবারকে একত্রিত করে। যখন একজন গ্রাহক (ক্লায়েন্ট) সার্বজনীন মেনু থেকে অর্ডার দেন, তখন অর্ডারটি বুদ্ধিমত্তার সাথে উপযুক্ত রেস্তোরাঁর রান্নাঘরে পাঠানো হয়, খাবার তৈরি করা হয় এবং তারপরে গ্রাহকের জন্য একটি একক ডেলিভারিতে একত্রিত করা হয়।

স্কিমা স্টিচিং-এর মূল ধারণা

স্কিমা স্টিচিং-এর সুবিধা

স্কিমা স্টিচিং মাইক্রোসার্ভিস আর্কিটেকচার গ্রহণকারী সংস্থাগুলির জন্য বেশ কিছু আকর্ষণীয় সুবিধা প্রদান করে:

স্কিমা স্টিচিং-এর সীমাবদ্ধতা

যদিও স্কিমা স্টিচিং অনেক সুবিধা দেয়, এর সীমাবদ্ধতা সম্পর্কে সচেতন থাকা গুরুত্বপূর্ণ:

স্কিমা স্টিচিং-এর ব্যবহারিক বাস্তবায়ন

আসুন Node.js এবং graphql-tools লাইব্রেরি (স্কিমা স্টিচিংয়ের জন্য একটি জনপ্রিয় পছন্দ) ব্যবহার করে কীভাবে স্কিমা স্টিচিং বাস্তবায়ন করা যায় তার একটি সরলীকৃত উদাহরণ দেখি। এই উদাহরণে দুটি মাইক্রোসার্ভিস জড়িত: একটি ইউজার সার্ভিস এবং একটি প্রোডাক্ট সার্ভিস

১. রিমোট স্কিমা সংজ্ঞায়িত করুন

প্রথমে, প্রতিটি রিমোট সার্ভিসের জন্য GraphQL স্কিমা সংজ্ঞায়িত করুন।

ইউজার সার্ভিস (user-service.js):


const { buildSchema } = require('graphql');

const userSchema = buildSchema(`
  type User {
    id: ID!
    name: String
    email: String
  }

  type Query {
    user(id: ID!): User
  }
`);

const users = [
  { id: '1', name: 'Alice Smith', email: 'alice@example.com' },
  { id: '2', name: 'Bob Johnson', email: 'bob@example.com' },
];

const userRoot = {
  user: (args) => users.find(user => user.id === args.id),
};

module.exports = {
  schema: userSchema,
  rootValue: userRoot,
};

প্রোডাক্ট সার্ভিস (product-service.js):


const { buildSchema } = require('graphql');

const productSchema = buildSchema(`
  type Product {
    id: ID!
    name: String
    price: Float
    userId: ID!  # ইউজার সার্ভিসের ফরেন কী
  }

  type Query {
    product(id: ID!): Product
  }
`);

const products = [
  { id: '101', name: 'Laptop', price: 1200, userId: '1' },
  { id: '102', name: 'Smartphone', price: 800, userId: '2' },
];

const productRoot = {
  product: (args) => products.find(product => product.id === args.id),
};

module.exports = {
  schema: productSchema,
  rootValue: productRoot,
};

২. গেটওয়ে সার্ভিস তৈরি করুন

এখন, গেটওয়ে সার্ভিস তৈরি করুন যা দুটি স্কিমাকে একত্রিত করবে।

গেটওয়ে সার্ভিস (gateway.js):


const { stitchSchemas } = require('@graphql-tools/stitch');
const { makeRemoteExecutableSchema } = require('@graphql-tools/wrap');
const { graphqlHTTP } = require('express-graphql');
const express = require('express');
const { introspectSchema } = require('@graphql-tools/wrap');
const { printSchema } = require('graphql');
const fetch = require('node-fetch');

async function createRemoteSchema(uri) {
  const fetcher = async (params) => {
    const response = await fetch(uri, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify(params),
    });
    return response.json();
  };

  const schema = await introspectSchema(fetcher);
  return makeRemoteExecutableSchema({
    schema,
    fetcher,
  });
}

async function main() {
  const userSchema = await createRemoteSchema('http://localhost:4001/graphql');
  const productSchema = await createRemoteSchema('http://localhost:4002/graphql');

  const stitchedSchema = stitchSchemas({
    subschemas: [
      { schema: userSchema },
      { schema: productSchema },
    ],
    typeDefs: `
      extend type Product {
        user: User
      }
    `,
    resolvers: {
      Product: {
        user: {
          selectionSet: `{ userId }`,
          resolve(product, args, context, info) {
            return info.mergeInfo.delegateToSchema({
              schema: userSchema,
              operation: 'query',
              fieldName: 'user',
              args: {
                id: product.userId,
              },
              context,
              info,
            });
          },
        },
      },
    },
  });

  const app = express();
  app.use('/graphql', graphqlHTTP({
    schema: stitchedSchema,
    graphiql: true,
  }));

  app.listen(4000, () => console.log('গেটওয়ে সার্ভার চলছে http://localhost:4000/graphql এ'));
}

main().catch(console.error);

৩. সার্ভিসগুলি চালান

আপনাকে ইউজার সার্ভিস এবং প্রোডাক্ট সার্ভিস বিভিন্ন পোর্টে চালাতে হবে। উদাহরণস্বরূপ:

ইউজার সার্ভিস (পোর্ট 4001):


const express = require('express');
const { graphqlHTTP } = require('express-graphql');
const { schema, rootValue } = require('./user-service');

const app = express();
app.use('/graphql', graphqlHTTP({
  schema: schema,
  rootValue: rootValue,
  graphiql: true,
}));

app.listen(4001, () => console.log('ইউজার সার্ভিস চলছে http://localhost:4001/graphql এ'));

প্রোডাক্ট সার্ভিস (পোর্ট 4002):


const express = require('express');
const { graphqlHTTP } = require('express-graphql');
const { schema, rootValue } = require('./product-service');

const app = express();
app.use('/graphql', graphqlHTTP({
  schema: schema,
  rootValue: rootValue,
  graphiql: true,
}));

app.listen(4002, () => console.log('প্রোডাক্ট সার্ভিস চলছে http://localhost:4002/graphql এ'));

৪. স্টিচড স্কিমা কোয়েরি করুন

এখন আপনি গেটওয়ের মাধ্যমে (পোর্ট 4000-এ চলমান) স্টিচড স্কিমা কোয়েরি করতে পারেন। আপনি এইরকম একটি কোয়েরি চালাতে পারেন:


query {
  product(id: "101") {
    id
    name
    price
    user {
      id
      name
      email
    }
  }
}

এই কোয়েরিটি "101" আইডি সহ প্রোডাক্টটি পুনরুদ্ধার করে এবং ইউজার সার্ভিস থেকে সংশ্লিষ্ট ইউজারকেও নিয়ে আসে, যা দেখায় কিভাবে স্কিমা স্টিচিং আপনাকে একটি একক অনুরোধে একাধিক সার্ভিস জুড়ে ডেটা কোয়েরি করার অনুমতি দেয়।

উন্নত স্কিমা স্টিচিং কৌশল

মৌলিক উদাহরণের বাইরে, এখানে কিছু উন্নত কৌশল রয়েছে যা আপনার স্কিমা স্টিচিং বাস্তবায়নকে উন্নত করতে ব্যবহার করা যেতে পারে:

স্কিমা স্টিচিং এবং অ্যাপোলো ফেডারেশনের মধ্যে নির্বাচন

যদিও স্কিমা স্টিচিং GraphQL ফেডারেশনের জন্য একটি কার্যকর বিকল্প, অ্যাপোলো ফেডারেশন তার উন্নত বৈশিষ্ট্য এবং উন্নত ডেভেলপার অভিজ্ঞতার কারণে আরও জনপ্রিয় পছন্দ হয়ে উঠেছে। এখানে দুটি পদ্ধতির একটি তুলনা দেওয়া হলো:

বৈশিষ্ট্য স্কিমা স্টিচিং অ্যাপোলো ফেডারেশন
স্কিমা সংজ্ঞা বিদ্যমান GraphQL স্কিমা ল্যাঙ্গুয়েজ ব্যবহার করে ডিরেক্টিভ সহ একটি ডিক্লেয়ারেটিভ স্কিমা ল্যাঙ্গুয়েজ ব্যবহার করে
কোয়েরি পরিকল্পনা ম্যানুয়াল কোয়েরি ডেলিগেশন প্রয়োজন অ্যাপোলো গেটওয়ে দ্বারা স্বয়ংক্রিয় কোয়েরি পরিকল্পনা
টাইপ এক্সটেনশন সীমিত সমর্থন টাইপ এক্সটেনশনের জন্য অন্তর্নির্মিত সমর্থন
কী ডিরেক্টিভ সমর্থিত নয় এনটিটি সনাক্ত করতে @key ডিরেক্টিভ ব্যবহার করে
ডিস্ট্রিবিউটেড ট্রেসিং ম্যানুয়াল বাস্তবায়ন প্রয়োজন ডিস্ট্রিবিউটেড ট্রেসিংয়ের জন্য অন্তর্নির্মিত সমর্থন
টুলিং এবং ইকোসিস্টেম কম পরিপক্ক টুলিং আরও পরিপক্ক টুলিং এবং একটি বড় কমিউনিটি
জটিলতা বড় সিস্টেমে পরিচালনা করা জটিল হতে পারে বড় এবং জটিল সিস্টেমের জন্য ডিজাইন করা হয়েছে

কখন স্কিমা স্টিচিং নির্বাচন করবেন:

কখন অ্যাপোলো ফেডারেশন নির্বাচন করবেন:

বাস্তব-বিশ্বের উদাহরণ এবং ব্যবহারের ক্ষেত্র

এখানে কিছু বাস্তব-বিশ্বের উদাহরণ রয়েছে যেখানে GraphQL ফেডারেশন, স্কিমা স্টিচিং সহ, ব্যবহার করা যেতে পারে:

স্কিমা স্টিচিং-এর জন্য সেরা অনুশীলন

একটি সফল স্কিমা স্টিচিং বাস্তবায়ন নিশ্চিত করতে, এই সেরা অনুশীলনগুলি অনুসরণ করুন:

উপসংহার

স্কিমা স্টিচিং সহ GraphQL ফেডারেশন একটি মাইক্রোসার্ভিস আর্কিটেকচারে একাধিক সার্ভিস থেকে ইউনিফাইড API তৈরির একটি শক্তিশালী পদ্ধতি সরবরাহ করে। এর মূল ধারণা, সুবিধা, সীমাবদ্ধতা এবং বাস্তবায়ন কৌশলগুলি বোঝার মাধ্যমে, আপনি ডেটা অ্যাক্সেস সহজ করতে, স্কেলেবিলিটি উন্নত করতে এবং রক্ষণাবেক্ষণযোগ্যতা বাড়াতে স্কিমা স্টিচিং ব্যবহার করতে পারেন। যদিও অ্যাপোলো ফেডারেশন একটি আরও উন্নত সমাধান হিসাবে আবির্ভূত হয়েছে, স্কিমা স্টিচিং সহজ পরিস্থিতি বা বিদ্যমান GraphQL সার্ভিসগুলিকে একীভূত করার জন্য একটি কার্যকর বিকল্প হিসাবে রয়ে গেছে। আপনার সংস্থার জন্য সেরা পদ্ধতিটি বেছে নিতে আপনার নির্দিষ্ট প্রয়োজন এবং প্রয়োজনীয়তাগুলি সাবধানে বিবেচনা করুন।

GraphQL ফেডারেশন: স্কিমা স্টিচিং - একটি বিস্তারিত গাইড | MLOG